//
// Created by Administrator on 2024/10/28.
//
// 通过 顺序结构来构建 栈 ==》 满足 先进后出/后进先出
// 构建 数据结构 结构体 包含 ==》 数组 表示 栈里的数据 & 指针 指向栈顶

#include "stdio.h"
// 1. 定义 栈的最大容量
#define MAXSIZE 1000

// 2. 定义 栈的结构体
typedef struct {
    // 2.1. 栈 数组 任意数据类型
    int data[MAXSIZE]; // 此时 数据类型 是整形
    // 2.2. 定义 指针 指向 栈顶
    int top; // 初始化为-1
}Stack;

// 3. 初始化 栈
void initStack(Stack * stack){ // 参数传入 指定栈的地址
    // 栈顶指针 指向-1
    stack -> top = -1;
}

// 4. 判断 栈是否为空
int isEmpty(Stack * stack){
    // 判断 栈顶的指针 指向的位置 ==》 初始化 指向-1 如果还是指向-1 表示栈为空 不是-1 不为空
    return stack->top == -1; // 输出为真，表示为空
}

// 5. 判断 栈是否已满
int isFull(Stack * stack){
    // 判断 栈顶指针 是否指向了 MAXSIZE-1
    return stack->top == MAXSIZE-1; // 如果为真 ，表示已满
}

// ***入栈操作

int stackPush(Stack * stack, int value){ // 明确插入的栈 明确插入的值
    // 1. 判断 栈 是否已满
    if(isFull(stack)){
        printf("Stack is full");
        return -1;
    }
    // 2. 栈顶指针在哪 向上移一个
    // stack->top++;
    // 3. 插入数据
    // stack->data[stack->top] = value;
    stack->data[++(stack->top)] = value;
    return 0;
}

// *** 出栈操作  先进来的后出去

int stackPop(Stack * stack){
    // 1. 判断 栈是否为空 无法出栈
    if(isEmpty(stack)){
        printf("stack is empty, could not pop");
        return -1;
    }
    // 2. 获取栈顶的值
//    int value = stack->data[stack->top];
    // 3. 栈顶的指针 下移一位
//    stack->top--;
//    return value;
    return stack->data[(stack->top)--];
}

int main(void){
    // 1. 新建一个栈
    Stack stack;
    // 2. 对栈初始化
    initStack(&stack);

    printf("%d\n", isEmpty(&stack));

    stackPush(&stack, 10);
    stackPush(&stack, 20);
    stackPush(&stack, 30);

    printf("the value of stack top is: %d\n", stackPop(&stack));
    printf("the value of stack top is: %d\n", stackPop(&stack));
    printf("the value of stack top is: %d\n", stackPop(&stack));

    stackPush(&stack, 10);
    stackPush(&stack, 20);
    stackPush(&stack, 30);

    printf("the value of stack top is: %d\n", stackPop(&stack));
    printf("the value of stack top is: %d\n", stackPop(&stack));
    printf("the value of stack top is: %d\n", stackPop(&stack));
}